package _搜索;

import java.util.Scanner;

public class _01DFS基础 {
	
	/*
	 * 
	 * 有一间长方形的房子，地上铺了红色、黑色两种颜色的正方形瓷砖。
	 * 你站在其中一块黑色的瓷砖上，只能向相邻（上下左右四个方向）的黑色瓷砖移动。
	 * 请写一个程序，计算你总共能够到达多少块黑色的瓷砖。
	 * 输入：第一行是两个整数n和m，在接下来的n行中，每行包括m个字符。
	 * 每个字符表示一块瓷砖的颜色
	 * 规则如下：
	 * 1. ‘.’：黑色的瓷砖;
	 * 2. ‘#’：红色的瓷砖;
	 * 3. ‘@’：黑色的瓷砖，并且你站在这块瓷砖上。该字符在每个数据集合中唯一出现一次。
	 * 
	 * */
	
	static int count = 0;
	static int n;
	static int m;
	
	public static void dfs(int x,int y,char[][] c) {
		// 首次调用时传入的是'@'的位置，'@'也是表示黑色瓷砖，所以这里+1正好
		// 能经过说明不是红色瓷砖，+1且标记成红色瓷砖，防止再次进入该位置
		count++;
		c[x][y] = '#';
		
		// 设置四个方位需要加减的下标
		int []dx = {1,-1,0,0};
		int []dy = {0,0,1,-1};
		// 遍历访问数组，对不同方位进行判断，没越界且是'.'的黑色瓷砖则继续从该方位dfs
		for(int i = 0; i < 4; i++) {
			int x1 = x + dx[i];
			int y1 = y + dy[i];
			
			if(x1 < 0 || x1 >= n || y1 < 0 || y1 >= m || c[x1][y1] != '.') {
				continue;
			}
			
			dfs(x1,y1,c);
			
		}
	}
	
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		n = scan.nextInt();
		m = scan.nextInt();
		char arr[][] = new char[n][m];
		String temp;
		int index[] = new int[2];
		
		for (int i = 0; i < n; i++) {
			temp = scan.next(); // 读取一行字符串
			for (int j = 0; j < m; j++) {
				// 直接从temp字符串中取得第j个字符，并赋值给arr[i][j]
				arr[i][j] = temp.charAt(j);
				// 存储起点位置
				if(temp.charAt(j) == '@') {
					index[0] = i;
					index[1] = j;
				}
			}
		}
		
		
		dfs(index[0],index[1],arr);


		System.out.print(count);
		scan.close();

	}
}
